package com.rc.web.converter;

import com.rc.pojo.dto.order.OrderFormDTO;
import com.rc.pojo.po.Activity;
import com.rc.pojo.po.Adoption;
import com.rc.pojo.po.Order;
import com.rc.pojo.vo.order.OrderPayVO;
import com.rc.pojo.vo.order.OrderVO;
import org.mapstruct.BeanMapping;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.MappingTarget;

/**
 * 订单转换器
 * 使用MapStruct实现DTO、PO、VO之间的转换
 */
@Mapper(componentModel = "spring") // 声明为Spring组件
public interface OrderConverter {

    /**
     * 根据活动信息更新订单
     * @param activity 活动实体
     * @param order 目标订单对象
     */
    @BeanMapping(ignoreByDefault = true) // 忽略默认映射
    @Mapping(source = "id",target = "itemId") // 活动ID映射到订单商品ID
    @Mapping(source = "price",target = "price") // 活动价格映射到订单价格
    @Mapping(source = "title",target = "title") // 活动标题映射到订单标题
    @Mapping(source = "farmId",target = "farmId") // 活动农场ID映射到订单农场ID
    @Mapping(target = "totalFee",expression = "java(activity.getPrice().multiply(new java.math.BigDecimal(order.getNum())))") // 计算总费用
    @Mapping(target = "cover",expression = "java(activity.getImgs().stream().findFirst().orElse(null).getUrl())") // 获取第一张图片作为封面
    void updateByActivity(Activity activity, @MappingTarget Order order);

    /**
     * 根据领养信息更新订单
     * @param adoption 领养实体
     * @param order 目标订单对象
     */
    @BeanMapping(ignoreByDefault = true) // 忽略默认映射
    @Mapping(source = "id",target = "itemId") // 领养ID映射到订单商品ID
    @Mapping(source = "price",target = "price") // 领养价格映射到订单价格
    @Mapping(source = "title",target = "title") // 领养标题映射到订单标题
    @Mapping(source = "farmId",target = "farmId") // 领养农场ID映射到订单农场ID
    @Mapping(target = "totalFee",expression = "java(adoption.getPrice().multiply(new java.math.BigDecimal(order.getNum())))") // 计算总费用
    @Mapping(target = "cover",expression = "java(adoption.getImgs().stream().findFirst().orElse(null).getUrl())") // 获取第一张图片作为封面
    void updateByAdoption(Adoption adoption, @MappingTarget Order order);

    /**
     * 将订单表单DTO转换为订单PO
     * @param dto 订单表单数据传输对象
     * @return 订单持久化对象
     */
    Order formDTO2DO(OrderFormDTO dto);

    /**
     * 将订单PO转换为订单VO
     * @param order 订单持久化对象
     * @return 订单视图对象
     */
    OrderVO toVO(Order order);

    /**
     * 将订单PO转换为支付VO
     * @param order 订单持久化对象
     * @return 订单支付视图对象
     */
    OrderPayVO toPayVO(Order order);
}
